package com.ruoyi.system.service.impl;

import java.util.Date;
import java.util.List;

import com.ruoyi.system.domain.SuperPointDetail;
import com.ruoyi.system.mapper.SuperPointDetailMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.system.mapper.SuperPointMapper;
import com.ruoyi.system.domain.SuperPoint;
import com.ruoyi.system.domain.vo.SuperPointVo;
import com.ruoyi.system.service.ISuperPointService;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;

/**
 * 用户积分Service业务层处理
 * 
 * @author ruoyi
 * @date 2025-08-13
 */
@Service
public class SuperPointServiceImpl implements ISuperPointService 
{
    @Autowired
    private SuperPointMapper superPointMapper;
    @Resource
    private SuperPointDetailMapper superPointDetailMapper;

    /**
     * 查询用户积分
     * 
     * @param id 用户积分主键
     * @return 用户积分
     */
    @Override
    public SuperPoint selectSuperPointById(Long id)
    {
        return superPointMapper.selectSuperPointById(id);
    }

    /**
     * 根据用户ID查询积分信息
     * 业务说明：用于快速查询指定用户的积分信息，常用于用户登录后显示积分
     * 
     * @param userId 用户ID
     * @return 用户积分记录，如果用户没有积分记录则返回null
     */
    @Override
    public SuperPoint selectSuperPointByUserId(Long userId)
    {
        return superPointMapper.selectSuperPointByUserId(userId);
    }

    /**
     * 查询用户积分列表
     * 
     * @param superPoint 用户积分查询条件
     * @return 用户积分列表
     */
    @Override
    public List<SuperPoint> selectSuperPointList(SuperPoint superPoint)
    {
        return superPointMapper.selectSuperPointList(superPoint);
    }

    /**
     * 查询用户积分列表（包含用户信息）
     * 业务说明：通过关联查询获取积分信息和用户基本信息，用于管理后台显示
     * 包含的信息：用户昵称、用户账号、积分数量、创建时间、更新时间等
     * 
     * @param superPoint 用户积分查询条件
     * @return 包含用户信息的积分VO集合
     */
    @Override
    public List<SuperPointVo> selectSuperPointVoList(SuperPoint superPoint)
    {
        return superPointMapper.selectSuperPointVoList(superPoint);
    }

    /**
     * 新增用户积分
     * 
     * @param superPoint 用户积分
     * @return 结果
     */
    @Override
    public int insertSuperPoint(SuperPoint superPoint)
    {
        return superPointMapper.insertSuperPoint(superPoint);
    }

    /**
     * 修改用户积分
     * 
     * @param superPoint 用户积分
     * @return 结果
     */
    @Override
    public int updateSuperPoint(SuperPoint superPoint)
    {
        return superPointMapper.updateSuperPoint(superPoint);
    }

    /**
     * 增加用户积分
     * 业务说明：用于用户获得积分时的业务场景，如购物、签到、活动奖励等
     * 实现逻辑：直接在现有积分基础上增加，无上限限制
     * 
     * @param userId 用户ID
     * @param points 增加的积分数（建议传入正数）
     * @return 影响的行数，1表示成功，0表示用户不存在积分记录
     */
    @Override
    @Transactional
    public int increaseUserPoints(Long userId, Integer points)
    {
        // 增加用户积分
        int i = superPointMapper.increaseUserPoints(userId, points);
        // 在用户积分表进行记录
        SuperPointDetail detail = new SuperPointDetail();
        detail.setUserId(userId);
        detail.setStatus(0L);
        detail.setPoint(points.longValue());
        detail.setTime(new Date());
        i*=superPointDetailMapper.insertSuperPointDetail(detail);
        return i;
    }

    /**
     * 减少用户积分
     * 业务说明：用于用户消费积分时的业务场景，如积分兑换、积分抵扣等
     * 实现逻辑：确保积分不会变为负数，如果积分不足则操作失败
     * 安全考虑：在SQL层面进行积分检查，防止积分变为负数
     * 
     * @param userId 用户ID
     * @param points 减少的积分数（建议传入正数）
     * @return 影响的行数，1表示成功，0表示积分不足或用户不存在
     */
    @Override
    @Transactional
    public int decreaseUserPoints(Long userId, Integer points)
    {

        int i = superPointMapper.decreaseUserPoints(userId, points);
        SuperPointDetail detail = new SuperPointDetail();
        detail.setUserId(userId);
        detail.setStatus(1L);
        detail.setPoint(points.longValue());
        detail.setTime(new Date());
        i*=superPointDetailMapper.insertSuperPointDetail(detail);
        return i;
    }

    /**
     * 批量删除用户积分
     * 
     * @param ids 需要删除的用户积分主键
     * @return 结果
     */
    @Override
    public int deleteSuperPointByIds(Long[] ids)
    {
        return superPointMapper.deleteSuperPointByIds(ids);
    }

    /**
     * 删除用户积分信息
     * 
     * @param id 用户积分主键
     * @return 结果
     */
    @Override
    public int deleteSuperPointById(Long id)
    {
        return superPointMapper.deleteSuperPointById(id);
    }
}
